/*
 * Copyright @ 苏州瑞云信息技术有限公司 All rights reserved.
 */
package cn.com.recloud.bbs.service.impl;

import cn.com.recloud.bbs.dao.ArticleTypeDao;
import cn.com.recloud.bbs.dao.MyArticleTypeDao;
import cn.com.recloud.bbs.entity.bbs_article_type;
import cn.com.recloud.bbs.entity.bbs_my_article_type;
import cn.com.recloud.bbs.service.ArticleTypeService;
import cn.com.recloud.bbs.util.UserUtil;
import cn.com.recloud.core.constant.SysConstant;
import cn.com.recloud.one.spring.exception.OneException;
import cn.com.recloud.one.spring.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * @author keblea xie
 * @date 2020-06-08
 */
@Service
public class ArticleTypeServiceImpl extends BaseServiceImpl<ArticleTypeDao, bbs_article_type> implements ArticleTypeService {
    @Resource
    ArticleTypeDao articleTypeDao;
    @Resource
    private MyArticleTypeDao myArticleTypeDao;
    @Autowired
    private UserUtil userUtil;

    /**
     * lookup弹窗查询文章分类
     * 查询不是系统默认的所有启用的分类
     */
    @Override
    public Map findArticleTypeList(String queryValue, Integer pageIndex, Integer pageSize) {
        QueryWrapper<bbs_article_type> wrapper = new QueryWrapper<>();
        wrapper.lambda().like(StringUtils.isNotBlank(queryValue),bbs_article_type::getName,queryValue)
                .eq(bbs_article_type::getStatecode, SysConstant.STATECODE_ENABLE)
                .and(wp -> wp.eq(bbs_article_type::getIs_sys,false).or().isNull(bbs_article_type::getSeq));
        int count =  articleTypeDao.selectCount(wrapper);
        Page<bbs_article_type> page = new Page<>(pageIndex,pageSize,count);
        IPage<bbs_article_type> iPage = articleTypeDao.selectPage(page, wrapper);
        HashMap<Object, Object> map = new HashMap(2);
        map.put("list", iPage.getRecords());
        map.put("count", count);
        return map;
    }

    @Override
    /**
     * app的首页分类查询
     */
    public List<bbs_my_article_type> allArticleType() {
        String userId = userUtil.getUserId();
        List<bbs_my_article_type> myArticleTypes = myArticleTypeDao.selectList(new QueryWrapper<bbs_my_article_type>().lambda().eq(bbs_my_article_type::getBbs_contactid, userId));
        //判断用户是否有自定义的分类，如果有返回用户分类
        if(myArticleTypes.size()>=1) {
            //默认分类的处理
            List<bbs_article_type> articleTypes = articleTypeDao.selectList(new QueryWrapper<bbs_article_type>().lambda( )
                    .eq(bbs_article_type::getStatecode, "0")
                    .eq(bbs_article_type::getIs_sys, true)
                    .orderByDesc(bbs_article_type::getIs_sys).orderByAsc(bbs_article_type::getSeq));
            List<bbs_my_article_type> article_types = new ArrayList<>();
            for (bbs_article_type type:articleTypes){
                bbs_my_article_type types = new bbs_my_article_type();
                types.setBbs_article_typeid(type.getBbs_article_typeid());
                types.setSeq(type.getSeq());
                types.setName(type.getName());
                article_types.add(types);
            }
            for (bbs_my_article_type type:myArticleTypes){
                type.setName(type.getBbs_article_typeidname());
            }
            article_types.addAll(myArticleTypes);
            return article_types;
        }
        List<bbs_article_type> articleTypes = articleTypeDao.selectList(new QueryWrapper<bbs_article_type>().lambda( )
                .eq(bbs_article_type::getStatecode, "0")
                .orderByDesc(bbs_article_type::getIs_sys)
                .orderByAsc(bbs_article_type::getSeq));
        /**
         * 将默认分类封装进个人分类的实体后返回
         */
        for (bbs_article_type type:articleTypes){
            bbs_my_article_type myArticleType = new bbs_my_article_type();
            myArticleType.setBbs_article_typeid(type.getBbs_article_typeid());
            myArticleType.setSeq(type.getSeq());
            myArticleType.setName(type.getName());
            myArticleTypes.add(myArticleType);
        }
        return myArticleTypes;
    }

    /**
     * 保存文章分类
     * @param entity
     * @return
     */
    @Override
    public boolean save(bbs_article_type entity) {
        String name = entity.getName();
        //分类名称唯一性校验
        QueryWrapper<bbs_article_type> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(bbs_article_type::getName,name);
        bbs_article_type bbsArticleType = articleTypeDao.selectOne(wrapper);
        if(bbsArticleType != null){
            throw new OneException("当前分类名称已存在");
        }
        return super.save(entity);
    }

    /**
     * 更新文章分类
     * @param entity
     * @return
     */
    @Override
    public boolean updateById(bbs_article_type entity) {
        //判断是否重名
        QueryWrapper<bbs_article_type> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(bbs_article_type::getName,entity.getName());
        bbs_article_type bbsArticleType = articleTypeDao.selectOne(wrapper);
        //排除掉自身重名
        bbs_article_type bbsArticleType1 = articleTypeDao.selectById(entity.getBbs_article_typeid());
        if(bbsArticleType != null && !bbsArticleType1.getName().equals(entity.getName())){
            throw new OneException("当前分类名称已存在");
        }
        return super.updateById(entity);
    }

}
